package com.coder.algorithm.offer_2;

import java.util.EmptyStackException;
import java.util.Stack;

/**
 * 包含 min 函数的栈
 *
 * @author yuhushuan
 * @date 2020/6/20 21:16
 */
public class _30_1_MinInStack {
    private Stack<Integer> data = new Stack<>();
    private Stack<Integer> min = new Stack<>();


    public int push(int item) {
        data.push(item);

        if (min.isEmpty() || item < min.peek()) {
            min.push(item);
        } else {
            min.push(min.peek());
        }
        return 0;
    }

    public int pop() {
        if (data.isEmpty()) {
            throw new EmptyStackException();
        }
        min.pop();
        return data.pop();
    }

    public int min() {
        if (min.isEmpty()) {
            throw new EmptyStackException();
        }
        return min.peek();
    }

    public static void main(String[] args) {
        _30_1_MinInStack stack = new _30_1_MinInStack();

        System.out.println("入栈：" + 3);
        stack.push(3);
        System.out.println("栈的最小元素：" + stack.min() + "\n");

        // 新压入栈的数字比之前的最小值大。
        System.out.println("入栈：" + 5);
        stack.push(5);
        System.out.println("栈的最小元素：" + stack.min() + "\n");

        // 新压入栈的数字比之前的最小值小。
        System.out.println("入栈：" + 2);
        stack.push(2);
        System.out.println("栈的最小元素：" + stack.min() + "\n");

        System.out.println("入栈：" + 4);
        stack.push(4);
        System.out.println("栈的最小元素：" + stack.min() + "\n");

        // 弹出栈的数字不是最小元素。
        System.out.println("出栈：" + stack.pop());
        System.out.println("栈的最小元素：" + stack.min() + "\n");

        // 弹出栈的数字是最小元素。
        System.out.println("出栈：" + stack.pop());
        System.out.println("栈的最小元素：" + stack.min() + "\n");
    }
}
